/**
*
*	custom_proc.c - Funciones auxiliares para crear entradas en /proc
*
*/

#include "custom_proc.h"

/**************************** INICIO FUNCIONES PROC *******************************/ 
/* Funcion de creacion de directorios en /proc */
int create_proc_dir_custom (char* directory, struct proc_dir_entry** proc_dir, struct proc_dir_entry** proc_parent)
{
	// Creamos el directorio con el nombre pasado por parametro
	*proc_dir = proc_mkdir(directory, *proc_parent);
	if (*proc_dir == NULL) {
		remove_proc_entry(directory, *proc_parent);	
		printk(KERN_ALERT "No se puede crear el directorio %s\n", directory);
		return -ENOMEM;
	} else {
		printk(KERN_ALERT "Creado el directorio %s\n", directory);
		if (*proc_parent != NULL) 
			printk(KERN_ALERT "Con directorio padre %s\n", (*proc_parent)->name);
		else
			printk(KERN_ALERT "Con directorio padre /proc\n");
		return 0;
	}
}

/* Funcion de eliminacion de directorios en /proc */
void remove_proc_dir_custom (char* directory, struct proc_dir_entry** proc_dir, struct proc_dir_entry** proc_parent) 
{
	remove_proc_entry(directory, *proc_parent);
	printk(KERN_ALERT "Eliminado el directorio %s\n",directory);
	if (*proc_parent != NULL) 
		printk(KERN_ALERT "Con directorio padre %s\n", (*proc_parent)->name);
	else
		printk(KERN_ALERT "Con directorio padre /proc\n");
}

/* Funcion de creacion de entradas en /proc */
int create_proc_entry_custom (char* entry, struct proc_dir_entry** proc_file, struct proc_dir_entry** proc_parent)
{
	// Creamos el directorio con el nombre pasado por parametro
	*proc_file = create_proc_entry (entry, 0644, *proc_parent);
	if (*proc_file == NULL) {
		remove_proc_entry(entry, *proc_parent);	
		printk(KERN_ALERT "No se puede crear la entrada %s\n", entry);
		return -ENOMEM;
	} else {
		printk(KERN_ALERT "Creada la entrada %s\n", entry);
		if (*proc_parent != NULL) 
			printk(KERN_ALERT "Con directorio padre /%s\n", (*proc_parent)->name);
		else
			printk(KERN_ALERT "Con directorio padre /proc\n");
		return 0;
	}
}

/* Funcion de eliminacion de entradas en /proc */
void remove_proc_entry_custom (char* entry, struct proc_dir_entry** proc_file, struct proc_dir_entry** proc_parent) {
	remove_proc_entry(entry, *proc_parent);
	printk(KERN_ALERT "Eliminada la entrada %s\n",entry);
	if (*proc_parent != NULL) 
		printk(KERN_ALERT "Con directorio padre /%s\n", (*proc_parent)->name);
	else
		printk(KERN_ALERT "Con directorio padre /proc\n");
}
/**************************** FIN FUNCIONES PROC **********************************/ 